/*
 * Copy me if you can.
 * by 20h
 */

#ifndef ARG_H__
#define ARG_H__

extern char * argv0;

/* use main(int argc, char *argv[]) */
#define ARGBEGIN                                                                         \
  for (argv0 = *argv, argv++, argc--; argv[0] && argv[0][0] == '-' && argv[0][1];        \
       argc--, argv++)                                                                   \
    {                                                                                    \
      char argc_;                                                                        \
      char ** argv_;                                                                     \
      int brk_;                                                                          \
      if (argv[0][1] == '-' && argv[0][2] == '\0')                                       \
        {                                                                                \
          argv++;                                                                        \
          argc--;                                                                        \
          break;                                                                         \
        }                                                                                \
      int i_;                                                                            \
      for (i_ = 1, brk_ = 0, argv_ = argv; argv[0][i_] && !brk_; i_++)                   \
        {                                                                                \
          if (argv_ != argv)                                                             \
            break;                                                                       \
          argc_ = argv[0][i_];                                                           \
          switch (argc_)

#define ARGEND                                                                           \
  }                                                                                      \
  }

#define ARGC() argc_

#define EARGF(x)                                                                         \
  ((argv[0][i_ + 1] == '\0' && argv[1] == NULL)                                          \
     ? ((x), abort(), (char *)0)                                                         \
     : (brk_ = 1,                                                                        \
        (argv[0][i_ + 1] != '\0') ? (&argv[0][i_ + 1]) : (argc--, argv++, argv[0])))

#define ARGF()                                                                           \
  ((argv[0][i_ + 1] == '\0' && argv[1] == NULL)                                          \
     ? (char *)0                                                                         \
     : (brk_ = 1,                                                                        \
        (argv[0][i_ + 1] != '\0') ? (&argv[0][i_ + 1]) : (argc--, argv++, argv[0])))

#endif
